package spring.configuration;

import com.me.common.pojo.Parent;
import com.me.common.pojo.Son;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 测试 @Configuration 注解的 full模式、lite模式
 *
 * @author ME
 * @date   2020/5/22
 */
@Configuration
public class AppConfig {
    public AppConfig() { System.out.println("【Spring】 带 @Configuration 注解"); }

    @Bean
    public Son son() {
        Son son = new Son();
        System.out.println("son created..." + son.hashCode());
        return son;
    }

    @Bean
    public Parent parent() {
        Son son = son();
        System.out.println("parent created...持有的Son是：" + son.hashCode());
        return new Parent(son);
    }


    /** ============================================================ */
    @Component
    public static class ComponentConfig {
        public ComponentConfig() {
            System.out.println("【Spring】 带 @Component 注解");
        }
    }

    @ImportResource
    public static class ImportResourceConfig {
        public ImportResourceConfig() {
            System.out.println("【Spring】 带 @ImportResource 注解");
        }
    }

    public static class BeImportedConfig {
        public BeImportedConfig() {
            System.out.println("【Spring】 被 @Import导入的类");
        }
    }

    @Import(BeImportedConfig.class)
    public static class ImportConfig {
        public ImportConfig() {
            System.out.println("【Spring】 带 @Import 注解");
        }
    }

    public static class NoAnnotationConfig {
        public NoAnnotationConfig() {
            System.out.println("【Spring】 无注解，但是类内部含有 @Bean 声明");
        }

        @Bean
        public String str() { return "2333"; }
    }

    @ComponentScan
    public static class ComponentScanConfig {
        public ComponentScanConfig() {
            System.out.println("【Spring】 带 @ComponentScan 注解");
        }
    }
}
